package com.lelouch.concurrency.theartofconcurrency.interrupt;

/**
 * @author lcy
 * @create 2018-08-23 11:16
 */
public class InterruptExample2 {

    public static void main(String[] args) {
        Thread t=new NThread();
        t.start();
        System.out.println("is start.......");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {

        }
        System.out.println("start interrupt..."+System.currentTimeMillis());
        t.interrupt();
        System.out.println("end interrupt ..."+System.currentTimeMillis());
    }

    public static class NThread extends Thread
    {

        @Override
        public void run() {
            while(!this.isInterrupted())
            {
                System.out.println("我没有种中断");
                try {
                    // 在JDK中，有很多阻塞方法的声明中有抛出InterruptedException异常，这暗示该方法是可中断的，这些方法会检测当前线程是否被中断，如果是，则立刻结束阻塞方法，并抛出InterruptedException异常。
                    //如果遇到的是可中断的阻塞方法抛出InterruptedException，可以继续向方法调用栈的上层抛出该异常，如果是检测到中断，则可清除中断状态并抛出InterruptedException，使当前方法也成为一个可中断的方法。
                    //若有时候不太方便在方法上抛出InterruptedException，比如要实现的某个接口中的方法签名上没有throws InterruptedException，这时就可以捕获可中断方法的InterruptedException并通过Thread.currentThread.interrupt()来重新设置中断状态。如果是检测并清除了中断状态，亦是如此。
                    //这个例子中还有一个非常重要的地方就是cache语句中，我们调用了Thread.currentThread().interrupt() 我们把这句代码去掉，运行你会发现这个线程无法终止，因为在抛出InterruptedException 的同时，线程的中断标志被清除了
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
            System.out.println("我已经结束了..."+System.currentTimeMillis());
        }

    }

}
